package com.anrongtec.zcpt.base;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;

import com.anrongtec.zcpt.R;
import com.anrongtec.zcpt.constant.Constant;
import com.anrongtec.zcpt.logo.LoginActivity;
import com.anrongtec.zcpt.module.AppModel;
import com.anrongtec.zcpt.module.User;
import com.anrongtec.zcpt.util.GsonUtil;
import com.anrongtec.zcpt.util.MyLocation;
import com.anrongtec.zcpt.util.Util;
import com.art.base.commonui.BaseDDApp;
import com.art.base.db.LiteOrmDBUtil;
import com.art.base.util.AppManager;
import com.art.base.util.DeviceFactory;
import com.art.base.util.PreferenceUtils;
import com.art.base.util.ToastShow;
import com.lzy.okhttputils.OkHttpUtils;
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.WeakMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import com.nostra13.universalimageloader.utils.StorageUtils;

import java.io.File;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
 * @functionName:
 * @Package com.art.mp.base
 * @author dongtianhao
 * @date 2016年6月12日 下午4:58:50
 * @version V1.0
 * @Description:替换应用的应用类
 */
public class DDApp extends BaseDDApp {
	public static DDApp dApp;
	private static Map<String, String> map;
	public boolean m_bKeyRight = true;
	public DisplayImageOptions opPic;
	ToastShow mToast;
	private List<Activity> mList = new LinkedList<Activity>();
	private User currentUser;

	private List<AppModel> mAppModels;

	public Context mContext;
	public List<AppModel> getAppModels() {
		return mAppModels;
	}

	public void setAppModels(List<AppModel> appModels) {
		mAppModels = appModels;
	}

	@Override
	public void onCreate() {
		super.onCreate();
		dApp = this;
		initOkHttp();
		initPreference();

		mToast = new ToastShow(this);
		// 初始化图片下载
		initImageLoader(this);
		mContext = DDApp.getInstance().getApplicationContext();

		//捕获异常
//		CrashHandler.getInstance().init(this);
		// 初始化liteorm
		LiteOrmDBUtil.createCascadeDB(this);

		// 初始化定位
		MyLocation.getInstance(this).registenerLocationChangeListener();

		// 初始化wlsdk
		// initWL();
		// 统一认证
		// initUA();
		// LogUtil.init(Log.ERROR,null, true);
	}

	private void initPreference() {
		PreferenceUtils.init(this);
	}

	// private void initWL() {
	// //配置sdk
	// WLConfig config = new WLConfig.Builder(this)
	// .setSendMode(SendMode.SEND_MODE_TIME)
	// .setSendTime(10*1000)
	// .setShowLog(false)
	// .build();
	//
	// //初始化
	// WLData.getInstance().init(config);
	// }

	/**
	 * 获取map格式公共参数,
	 * 
	 * @return
	 */
	public Map<String, String> getBaseInfo() {

		if (map == null) {
			// LogUtil.trace(Log.DEBUG, "application", "baseInfo未初始化");
			initBaseInfo();
		}

		return map;
	}

	/**
	 * 初始化公共参数, 每次Login页面登录之前调用. map适用于当前登录的用户,切换用户之后重新初始化
	 */
	public void initBaseInfo() {
		map = new HashMap<String, String>();
		// map.put("busCode", getBusCode());
		map.put("appType", null);
		map.put("appVersion", Util.getVersionCode(this) + "");
		map.put("appOs", Util.getAppOS());
		map.put("deviceSN", Util.getDeviceSN(this));
		map.put("deviceType", "Android");
		map.put("mac", DeviceFactory.getInstance(this).getMacAddress());
		map.put("ip", Util.getIP(this));
		map.put("longitude", MyLocation.getLongitude());
		map.put("latitude", MyLocation.getLatitude());
		map.put("altitude", MyLocation.getAltitude());
		map.put("netType", PreferenceUtils.getInstance(getApplicationContext()).getString(Constant.NETTYPE));
		// TODO 以下三项必须和登录时一致
		map.put("imei", DeviceFactory.getInstance(this).getIMEI());
		map.put("imsi", DeviceFactory.getInstance(this).getIMSI());
		map.put("uuid", DeviceFactory.getInstance(this).getDeviceUUID());
	}

	public String getBaseInfoJson() {
		if (map == null) {
			initBaseInfo();
		}
		return GsonUtil.getInstance().toJson(map);
	}

	private void initOkHttp() {

		// HttpHeaders headers = new HttpHeaders();
		// headers.put("commonHeaderKey1", "commonHeaderValue1"); // 所有的 header
		// 都
		// headers.put("commonHeaderKey2", "commonHeaderValue2");
		// HttpParams params = new HttpParams();
		// params.put("commonParamsKey1", "commonParamsValue1"); // 所有的 params 都
		// 支持
		// // 中文
		// params.put("commonParamsKey2", "这里支持中文参数");
		OkHttpUtils.init(this);
		// 以下都不是必须的，根据需要自行选择
		OkHttpUtils.getInstance()//
//				.debug("OkHttpUtils") // 是否打开调试
				.setConnectTimeout(OkHttpUtils.DEFAULT_MILLISECONDS) // 全局的连接超时时间
				.setReadTimeOut(OkHttpUtils.DEFAULT_MILLISECONDS) // 全局的读取超时时间
				.setWriteTimeOut(OkHttpUtils.DEFAULT_MILLISECONDS);// 全局的写入超时时间
		// .addCommonHeaders(headers) // 设置全局公共头
		// .addCommonParams(params);//添加公共参数
	}

	/** 初始化ImageLoader */
	public void initImageLoader(Context context) {
		File cacheDir = StorageUtils.getOwnCacheDirectory(context, Constant.CACHE_DIR_IMAGE);// 获取到缓存的目录地址

		opPic = new DisplayImageOptions.Builder().showImageForEmptyUri(R.color.grey_text)// 设置图片Uri为空或是错误的时候显示的图片
				.showImageOnLoading(R.color.grey_text)// 设置图片在下载期间显示的图片
				.showImageOnFail(R.color.grey_text)//
				// 设置图片加载/解码过程中错误时候显示的图片
				.cacheInMemory(true)// 设置下载的图片是否缓存在内存中
				.cacheOnDisk(true)// 设置下载的图片是否缓存在SD卡中
				.considerExifParams(true)// 是否考虑JPEG图像EXIF参数（旋转，翻转）
				.imageScaleType(ImageScaleType.IN_SAMPLE_INT)// 设置图片以如何的编码方式显示
				.bitmapConfig(Bitmap.Config.RGB_565)// 设置图片的解码类型//
				// .decodingOptions(android.graphics.BitmapFactory.Options decodingOptions) //设置图片的解码配置
				.delayBeforeLoading(0)// int delayInMillis为你设置的下载前的延迟时间
				.resetViewBeforeLoading(true)// 设置图片在下载前是否重置，复位
				.displayer(new FadeInBitmapDisplayer(0))// 是否图片加载好后渐入的动画时间
				// .displayer(new SimpleBitmapDisplayer())
				.build();// 构建完成

		// 创建配置ImageLoader(所有的选项都是可选的,只使用那些你真的想定制)，这个可以设定在APPLACATION里面，设置为全局的配置参数
		ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
				// .memoryCacheExtraOptions(480, 800) // max width, max
				// height，即保存的每个缓存文件的最大长宽 // default = device screen dimensions
				.threadPoolSize(3)
				// 线程池内加载数量
				.threadPriority(Thread.NORM_PRIORITY - 2).denyCacheImageMultipleSizesInMemory()
				// .memoryCache(new UsingFreqLimitedMemoryCache(14 * 1024 *
				// 1024)) //You can pass your own memory cache implementation
				// /你可以通过自己的内存缓存实现
				.memoryCache(new WeakMemoryCache()).memoryCacheSize(2 * 1024 * 1024)
				// .diskCacheSize(80 * 1024 * 1024)
				.discCacheFileNameGenerator(new Md5FileNameGenerator())
				// 将保存的时候的URI名称用MD5 加密
				.tasksProcessingOrder(QueueProcessingType.LIFO).discCacheFileCount(100) // 缓存的文件数量
				.diskCache(new UnlimitedDiskCache(cacheDir)) // 自定义缓存路劲
				.defaultDisplayImageOptions(opPic)
				// .imageDownloader(new BaseImageDownloader(context, 5 * 1000,
				// 30 * 1000)) //connectTimeout( 5s ), readTimeout ( 30 ) 超时时间
				.writeDebugLogs() // Remove for release app
				.build(); // 开始构建
		ImageLoader.getInstance().init(config);// TODO 全局初始化此配置
		// ImageLoader.getInstance().init(new
		// ImageLoaderConfiguration.Builder(context).build());
	}

	// private void initDefault() {
	// 默认为false 第一次登陆后默认为true
	// if (!DDApp.dApp.preferences.getBoolean(Contants.First_Enter)) {
	// DDApp.dApp.preferences.saveBoolean(Contants.First_Enter, true);
	// DDApp.dApp.preferences.saveBoolean(Contants.SW_Vibration, true);
	// DDApp.dApp.preferences.saveString(Contants.POST_IP, "127.0.0.1");//
	// 211.149.198.196
	// DDApp.dApp.preferences.saveString(Contants.POST_POST, "11001");
	// // DDApp.dApp.preferences.saveString(Contants.LOGIN_INPUT,
	// // "22010619641129961X");
	// DDApp.dApp.preferences.saveInt(Contants.PUSH.PUSH_PORT, 11003);// 5222
	// }
	// }

	/** 初始化ImageLoader */
	// public static void initImageLoader(Context context) {
	// File cacheDir = StorageUtils.getOwnCacheDirectory(context,
	// Constant.CACHE_DIR_IMAGE);// 获取到缓存的目录地址
	// LogUtil.e("cacheDir" + cacheDir.getPath());
	// //
	// 创建配置ImageLoader(所有的选项都是可选的,只使用那些你真的想定制)，这个可以设定在APPLACATION里面，设置为全局的配置参数
	// ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
	// context)
	// // 线程池内加载的数量
	// .threadPoolSize(3).threadPriority(Thread.NORM_PRIORITY - 2)
	// .memoryCache(new WeakMemoryCache())
	// .denyCacheImageMultipleSizesInMemory()
	// /***
	// * 新增*** / .memoryCache(new LruMemoryCache(2 * 1024 * 1024))
	// * .memoryCacheSize(2 * 1024 * 1024)
	// * .memoryCacheSizePercentage(13) // default /***新增end
	// ***/
	// .discCacheFileNameGenerator(new Md5FileNameGenerator())
	// // 将保存的时候的URI名称用MD5 加密
	// .tasksProcessingOrder(QueueProcessingType.LIFO)
	// .discCache(new UnlimitedDiskCache(cacheDir))// 自定义缓存路径
	// // .defaultDisplayImageOptions(DisplayImageOptions.createSimple())
	// .writeDebugLogs() // Remove for release app
	// .build();
	// // Initialize ImageLoader with configuration.
	// ImageLoader.getInstance().init(config);// 全局初始化此配置
	// }

	@Override
	public void onLowMemory() {
		// TODO Auto-generated method stub
		super.onLowMemory();
		// ImageLoader_ imLoader = ImageLoader_.getInstance();
		// imLoader.clearCache();
		// System.gc();
	}

	public User getCurrentUser() {
		if (currentUser == null) {
			ToastShow.shortMessage("连接超时,请重新登录");
			AppManager.getAppManager().finishAllActivity();
			Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
			intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
			intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			currentUser = new User();
			getApplicationContext().startActivity(intent);

		}
		return currentUser;
	}

	public void setCurrentUser(User currentUser) {
		this.currentUser = currentUser;
	}

	public DDApp() {

	}

	public synchronized static DDApp getInstance() {
		if (null == dApp) {
			dApp = new DDApp();
		}
		return dApp;
	}

	// add Activity
	public void addActivity(Activity activity) {
		mList.add(activity);
	}

	/**
	 * 获取activity做相应的处理
	 */
	public void exit() {

		try {
			for (Activity activity : mList) {
				if (activity != null)
					activity.finish();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			System.exit(0);
		}
	}

}
